package com.example.bookstore.cart;

import java.util.*;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import com.example.bookstore.entity.Book;

@ManagedBean(name = "cart")
@SessionScoped
public class ShoppingCart {
	HashMap<String, ShoppingCartItem> items = null;
	int numberOfItems = 0;

	public ShoppingCart() {
		items = new HashMap<String, ShoppingCartItem>();
	}

	public synchronized void add(String bookId, Book book) {
		if (items.containsKey(bookId)) {
			ShoppingCartItem scitem = items.get(bookId);
			scitem.incrementQuantity();
		} else {
			ShoppingCartItem newItem = new ShoppingCartItem(book);
			items.put(bookId, newItem);
		}
		System.out.println("ShoppingCart: added " + bookId + " to cart");
	}

	public synchronized void remove(String bookId) {
		if (items.containsKey(bookId)) {
			ShoppingCartItem scitem = items.get(bookId);
			scitem.decrementQuantity();

			if (scitem.getQuantity() <= 0) {
				items.remove(bookId);
			}

			numberOfItems--;
		}
	}

	public synchronized List<ShoppingCartItem> getItems() {
		List<ShoppingCartItem> results = new ArrayList<ShoppingCartItem>();
		results.addAll(this.items.values());

		return results;
	}

	@Override
	protected void finalize() throws Throwable {
		items.clear();
	}

	public synchronized int getNumberOfItems() {
		numberOfItems = 0;

		for (ShoppingCartItem item : getItems()) {
			numberOfItems += item.getQuantity();
		}

		return numberOfItems;
	}

	public synchronized double getTotal() {
		double amount = 0.0;

		for (ShoppingCartItem item : getItems()) {
			Book bookDetails = item.getItem();
			amount += (item.getQuantity() * bookDetails.getPrice());
		}

		return roundOff(amount);
	}

	private double roundOff(double x) {
		long val = Math.round(x * 100); // cents

		return val / 100.0;
	}

	public synchronized void clear() {
		items.clear();
		numberOfItems = 0;
	}
}
